{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Gaussian Process Latent Variable Models (GPLVM) with SVI \n",
    "\n",
    "Vidhi Lalchand, 2021\n",
    "\n",
    "## Introduction \n",
    "\n",
    "In this notebook we demonstrate the GPLVM model class introduced in [Lawrence, 2005](https://proceedings.neurips.cc/paper/2003/file/9657c1fffd38824e5ab0472e022e577e-Paper.pdf) and its Bayesian incarnation introduced in [Titsias & Lawrence, 2010](http://proceedings.mlr.press/v9/titsias10a/titsias10a.pdf).\n",
    "\n",
    "GPLVMs use Gaussian processes in an unsupervised context, where a low dimensional representation of the data ($X \\equiv \\{\\mathbf{x}_{n}\\}_{n=1}^{N}\\in \\mathbb{R}^{N \\times Q}$) is learnt given some high dimensional real valued observations $Y \\equiv \\{\\mathbf{y}_{n}\\}_{n=1}^{N} \\in \\mathbb{R}^{N \\times D}$. $Q < D$ provides dimensionality reduction. The forward mapping ($X \\longrightarrow Y$) is governed by GPs independently defined across dimensions $D$. Q (the dimensionality of the latent space is usually fixed before hand).\n",
    "\n",
    "One can either learn point estimates for each $\\mathbf{x}_{n}$ by maximizing the GP marginal likelihood jointly wrt. the kernel hyperparameters $\\theta$ and the latent inputs $\\mathbf{x}_{n}$. Alternatively, one can variationally integrate out $X$ by using the sparse variational formulation where a variational distribution $q(X) = \\prod_{n=1}^{N}\\mathcal{N}(\\mathbf{x}_{n}; \\mu_{n}, s_{n}\\mathbb{I}_{Q})$. This tutorial focuses on the latter. \n",
    "\n",
    "The probabilistic model is: \n",
    "\n",
    "\\begin{align*}\n",
    "\\textrm{ Prior on latents: } p(X) &= \\displaystyle \\prod _{n=1}^N \\mathcal{N} (\\mathbf{x}_{n};\\mathbf{0}, \\mathbb{I}_{Q}),\\\\\n",
    "\\textrm{Prior on mapping: }    p(\\mathbf{f}|X, \\mathbf{\\theta}) &= \\displaystyle \\prod_{d=1}^{D}\\mathcal{N}(\\mathbf{f}_{d}; \\mathbf{0}, K_{ff}^{(d)}),\\\\\n",
    "\\textrm{Data likelihood: }  p(Y| \\mathbf{f}, X) &= \\prod_{n=1}^N \\prod_{d=1}^D \\mathcal{N}(y_{n,d}; \\mathbf{f}_{d}(\\mathbf{x}_{n}), \\sigma^{2}_{y}),\n",
    "\\end{align*}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Standard imports\n",
    "import matplotlib.pylab as plt\n",
    "import torch\n",
    "import os\n",
    "import numpy as np\n",
    "from pathlib import Path\n",
    "\n",
    "# gpytorch imports\n",
    "from gpytorch.mlls import VariationalELBO\n",
    "from gpytorch.priors import NormalPrior\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "# Setting manual seed for reproducibility\n",
    "torch.manual_seed(73)\n",
    "np.random.seed(73)\n",
    "\n",
    "# this is for running the notebook in our testing framework\n",
    "smoke_test = ('CI' in os.environ)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Set up training data \n",
    "\n",
    "We use the canonical multi-phase oilflow dataset used in [Titsias & Lawrence, 2010](http://proceedings.mlr.press/v9/titsias10a/titsias10a.pdf) that consists of 1000, 12 dimensional observations belonging to three known classes corresponding to different phases of oilflow. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import urllib.request\n",
    "import tarfile\n",
    "\n",
    "with tarfile.open('3PhData.tar.gz', 'r') as f:\n",
    "    f.extract('DataTrn.txt')\n",
    "    f.extract('DataTrnLbls.txt')\n",
    "\n",
    "Y = torch.Tensor(np.loadtxt(fname='DataTrn.txt'))\n",
    "labels = torch.Tensor(np.loadtxt(fname='DataTrnLbls.txt'))\n",
    "labels = (labels @ np.diag([1, 2, 3])).sum(axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Defining the GPLVM model\n",
    "\n",
    "We will be using the BayesianGPLVM model class which is compatible with three different modes of inference. \n",
    "\n",
    "(a) Point estimate for the latent variables $X \\equiv \\{x_{n}\\}_{n=1}^{N}$. \\\n",
    "(b) MAP estimate for the latent variables where we have an additional log prior term in the ELBO. \n",
    "(c) Variational distribution $q(x_{n})$ corresponding to latent variables.\n",
    "\n",
    "The latent variable ELBO for (c) is given by:\n",
    "\n",
    "$$\\mathcal{L} = \\sum_{n, d}\\mathbb{E}_{q_{\\phi}(\\mathbf{x}_{n})}\\mathbb{E}_{p(\\mathbf{f}_{d}|\\mathbf{u}_{d}, \\mathbf{x}_{n})q_{\\lambda}(\\mathbf{u}_{d})}[\\log \\mathcal{N}(y_{n,d};\\mathbf{f}_{d}(\\mathbf{x}_{n}), \\sigma^{2}_{y})]) - \\sum_{n}\\textrm{KL}(q_{\\phi}(\\mathbf{x}_{n})||p(\\mathbf{x}_{n})) - \\sum_{d}\\textrm{KL}(q_{\\lambda}(\\mathbf{u}_{d})||p(\\mathbf{u}_{d}|Z))$$\n",
    "\n",
    "The latent variable ELBO corresponding to (a) just has the first two terms and corresponding to (b) includes the log prior for latent variables $p(\\mathbf{x}_{n})$ in the ELBO.  \n",
    "\n",
    "This ELBO is optimised w.r.t local variational parameters $\\phi$, global variational parameters $\\lambda$, kernel hyperparameters $\\theta$ and likelihood noise $\\sigma^{y}$.\n",
    "\n",
    "The BayesianGPLVM is built on top of the Sparse GP formulation. Similar to the [SVGP example](../04_Variational_and_Approximate_GPs/SVGP_Regression_CUDA.ipynb), we'll use a `CholeskyVariationalDistribution` to model $q(\\mathbf{u})$ and the standard `VariationalStrategy` as defined by Hensman et al. (2015).\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from gpytorch.models.gplvm.latent_variable import *\n",
    "from gpytorch.models.gplvm.bayesian_gplvm import BayesianGPLVM\n",
    "from matplotlib import pyplot as plt\n",
    "from tqdm.notebook import trange\n",
    "from gpytorch.means import ZeroMean\n",
    "from gpytorch.mlls import VariationalELBO\n",
    "from gpytorch.priors import NormalPrior\n",
    "from gpytorch.likelihoods import GaussianLikelihood\n",
    "from gpytorch.variational import VariationalStrategy\n",
    "from gpytorch.variational import CholeskyVariationalDistribution\n",
    "from gpytorch.kernels import ScaleKernel, RBFKernel\n",
    "from gpytorch.distributions import MultivariateNormal\n",
    "\n",
    "\n",
    "def _init_pca(Y, latent_dim):\n",
    "    U, S, V = torch.pca_lowrank(Y, q = latent_dim)\n",
    "    return torch.nn.Parameter(torch.matmul(Y, V[:,:latent_dim]))\n",
    "\n",
    "\n",
    "class bGPLVM(BayesianGPLVM):\n",
    "    def __init__(self, n, data_dim, latent_dim, n_inducing, pca=False):\n",
    "        self.n = n\n",
    "        self.batch_shape = torch.Size([data_dim])\n",
    "        \n",
    "        # Locations Z_{d} corresponding to u_{d}, they can be randomly initialized or \n",
    "        # regularly placed with shape (D x n_inducing x latent_dim).\n",
    "        self.inducing_inputs = torch.randn(data_dim, n_inducing, latent_dim)\n",
    "    \n",
    "        # Sparse Variational Formulation (inducing variables initialised as randn)\n",
    "        q_u = CholeskyVariationalDistribution(n_inducing, batch_shape=self.batch_shape) \n",
    "        q_f = VariationalStrategy(self, self.inducing_inputs, q_u, learn_inducing_locations=True)\n",
    "    \n",
    "        # Define prior for X\n",
    "        X_prior_mean = torch.zeros(n, latent_dim)  # shape: N x Q\n",
    "        prior_x = NormalPrior(X_prior_mean, torch.ones_like(X_prior_mean))\n",
    "    \n",
    "        # Initialise X with PCA or randn\n",
    "        if pca == True:\n",
    "             X_init = _init_pca(Y, latent_dim) # Initialise X to PCA \n",
    "        else:\n",
    "             X_init = torch.nn.Parameter(torch.randn(n, latent_dim))\n",
    "          \n",
    "        # LatentVariable (c)\n",
    "        X = VariationalLatentVariable(n, data_dim, latent_dim, X_init, prior_x)\n",
    "        \n",
    "        # For (a) or (b) change to below:\n",
    "        # X = PointLatentVariable(n, latent_dim, X_init)\n",
    "        # X = MAPLatentVariable(n, latent_dim, X_init, prior_x)\n",
    "        \n",
    "        super().__init__(X, q_f)\n",
    "        \n",
    "        # Kernel (acting on latent dimensions)\n",
    "        self.mean_module = ZeroMean(ard_num_dims=latent_dim)\n",
    "        self.covar_module = ScaleKernel(RBFKernel(ard_num_dims=latent_dim))\n",
    "\n",
    "    def forward(self, X):\n",
    "        mean_x = self.mean_module(X)\n",
    "        covar_x = self.covar_module(X)\n",
    "        dist = MultivariateNormal(mean_x, covar_x)\n",
    "        return dist\n",
    "    \n",
    "    def _get_batch_idx(self, batch_size):\n",
    "        valid_indices = np.arange(self.n)\n",
    "        batch_indices = np.random.choice(valid_indices, size=batch_size, replace=False)\n",
    "        return np.sort(batch_indices)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training the model\n",
    "\n",
    "While we need to specify the dimensionality of the latent variables at the outset, one of the advantages \n",
    "of the Bayesian framework is that by using a ARD kernel we can prune dimensions corresponding to small inverse lengthscales."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "N = len(Y)\n",
    "data_dim = Y.shape[1]\n",
    "latent_dim = data_dim\n",
    "n_inducing = 25\n",
    "pca = False\n",
    "\n",
    "# Model\n",
    "model = bGPLVM(N, data_dim, latent_dim, n_inducing, pca=pca)\n",
    "\n",
    "# Likelihood\n",
    "likelihood = GaussianLikelihood(batch_shape=model.batch_shape)\n",
    "\n",
    "# Declaring the objective to be optimised along with optimiser \n",
    "# (see models/latent_variable.py for how the additional loss terms are accounted for)\n",
    "mll = VariationalELBO(likelihood, model, num_data=len(Y))\n",
    "    \n",
    "optimizer = torch.optim.Adam([\n",
    "    {'params': model.parameters()},\n",
    "    {'params': likelihood.parameters()}\n",
    "], lr=0.01)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We use mini-batch training for scalability where only a subset of the local variaitonal params are optimised in each iteration. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1590806ddd1f442887152ce2e69cf614",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value=''), FloatProgress(value=0.0, max=10000.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "# Training loop - optimises the objective wrt kernel hypers, variational params and inducing inputs\n",
    "# using the optimizer provided.\n",
    "    \n",
    "loss_list = []\n",
    "iterator = trange(10000 if not smoke_test else 4, leave=True)\n",
    "batch_size = 100\n",
    "for i in iterator: \n",
    "    batch_index = model._get_batch_idx(batch_size)\n",
    "    optimizer.zero_grad()\n",
    "    sample = model.sample_latent_variable()  # a full sample returns latent x across all N\n",
    "    sample_batch = sample[batch_index]\n",
    "    output_batch = model(sample_batch)\n",
    "    loss = -mll(output_batch, Y[batch_index].T).sum()\n",
    "    loss_list.append(loss.item())\n",
    "    iterator.set_description('Loss: ' + str(float(np.round(loss.item(),2))) + \", iter no: \" + str(i))\n",
    "    loss.backward()\n",
    "    optimizer.step()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualising the 2d latent subspace\n",
    "Visualising a two dimensional slice of the latent space corresponding to the most dominant latent dimensions.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x576 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "inv_lengthscale = 1 / model.covar_module.base_kernel.lengthscale\n",
    "values, indices = torch.topk(model.covar_module.base_kernel.lengthscale, k=2,largest=False)\n",
    "\n",
    "l1 = indices.numpy().flatten()[0]\n",
    "l2 = indices.numpy().flatten()[1]\n",
    "\n",
    "plt.figure(figsize=(20, 8))\n",
    "colors = ['r', 'b', 'g']\n",
    "\n",
    "plt.subplot(131)\n",
    "X = model.X.q_mu.detach().numpy()\n",
    "std = torch.nn.functional.softplus(model.X.q_log_sigma).detach().numpy()\n",
    "plt.title('2d latent subspace corresponding to 3 phase oilflow', fontsize='small')\n",
    "plt.xlabel('Latent dim 1')\n",
    "plt.ylabel('Latent dim 2')\n",
    "\n",
    "# Select index of the smallest lengthscales by examining model.covar_module.base_kernel.lengthscales \n",
    "for i, label in enumerate(np.unique(labels)):\n",
    "    X_i = X[labels == label]\n",
    "    scale_i = std[labels == label]\n",
    "    plt.scatter(X_i[:, l1], X_i[:, l2], c=[colors[i]], label=label)\n",
    "    plt.errorbar(X_i[:, l1], X_i[:, l2], xerr=scale_i[:,l1], yerr=scale_i[:,l2], label=label,c=colors[i], fmt='none')\n",
    "    \n",
    "plt.subplot(132)\n",
    "plt.bar(np.arange(latent_dim), height=inv_lengthscale.detach().numpy().flatten())\n",
    "plt.title('Inverse Lengthscale with SE-ARD kernel', fontsize='small')\n",
    "\n",
    "plt.subplot(133)\n",
    "plt.plot(loss_list, label='batch_size=100')\n",
    "plt.title('Neg. ELBO Loss', fontsize='small')\n",
    "None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The vertical and horizontal bars indicate axis aligned Gaussian uncertainty around each latent point. "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
